Глава 1 (продолжение 1)
Вверх
Эта программа построчно считывает из текстового файла, затем в строке ищет подстроку (лексему). Найдя лексему, программа вставляет перед каждой найденной лексемой новую строку. И разыскиваемая лексема и новая строка для вставки переданы программным способом (заданы программно до компиляции).
Программа 01_01
//using namespace std;
char*
fun1
(char *p1a,char *p3, char *p,char *p1,char *p2,
while (p = strstr(p, word))
strncpy(p2,p1,z);
p2 = p2 + z;
p2 +=l_word1; // все слова теперь слева от указателя
p1 = p;
strcpy(p2,p1);
strcpy(p1a,p3);
return p2;
int main( int argc,char* argv[])
ifstream from1("text1");//открываем файл для считывания
if(!from1)
ofstream to1("text2" ); // open for writing
if(!to1)
//--------------------------------------------------
const int len = 200;
char word []= "<IMG SRC=";
char buf[len];
char *p = buf;//сорентируем указатель на начало массива buf
char *p2 = buf1;//сорентируем указатель на начало массива buf1
p2 = buf1;//сорентируем указатель на начало массива buf
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, word, word1,to1) ;
to1 << p3 << "\n"; // and write it to the file
//////////////////////////////////////////////////////////
//--------------------------------------------------
from1.close(); // always pays to be tidy
to1.close(); // always pays to be tidy
return 0;
Эта программа откомпилирована и выполнена в 6-й версии
Анализ:
1.Сначала в главной функции main объявляем два массива
2.Затем объявляем пять указателей на символьные массивы
char *p2 = buf1;//сорентируем указатель на начало массива buf1
3. Считываем первую строку из текстового файла в массив buf
while (!from1.eof())
p2 = buf1;//сорентируем указатель на начало массива buf
fun1 (p1a, p3, p, p1, p2,l_word,l_word1, word, word1, buf1, to1) ;
В качестве параметров в числе прочих передаем так же пять только
4.Рассмотрим работу функции fun1()
while (p = strstr(p, word))
{
int z = 0;
strncpy(p2,p1,z);
p2 = p2 + z;
p2 +=l_word1; // все слова теперь слева от указателя
p1 = p;
strcpy(p2,p1);
strcpy(p1a,p3);
return p2;
Анализ:
Функция имеет всего дюжину строк, но выполняет всю необходимую работу.
1. В начале в заголовке цикла while вызывается функция strstr()
while (p = strstr(p, word))
У нас указатель p инициализирован на начало массива buf
(помним: p = buf; //сорентируем указатель на начало массива buf)
Таким образом функция strstr ищет лексему word в массиве buf.
Возвращает функция позицию вхождения этой лексемы в массив,
Теперь мы можем определить сколько символов от начала массива мы можем
int z = 0;
Здесь p1 у нас ориентирован на начало массива buf,
Определяем количество символов, сохраняем их количество в z
strncpy(p2,p1,z);
Таким образом мы скопировали z символов из масива buf на начало
2. Теперь надо передвинуть указатель p2 массива buf1 вперед на z
p2 = p2 + z;
Скопировали лексему содержащуюся в word1 в нужное место массива buf1.
Далее опять передвинем указатель p2 вперед на количество символов которое
p2 +=l_word1; // все слова теперь слева от указателя
Теперь указатель p2 указывает на первую чистую ячейку в массиве
p1 = p;
Теперь цикл while можно повторить чтобы искать следующее вхождение
Цикл while повторится столько раз, сколько есть вхождений лексемы
strcpy(p2,p1);
Сохраним полученный результат, чтобы можно было использовать
strcpy(p1a,p3);
То есть фактически копируем buf1 обратно в buf. При этом прежнее
Назад |
Начало урока |
Вверх |
Вперед
Поиск лексемы и вставка строки
// Example_01_01 Поиск лексемы и вставка строки
#include <fstream.h>
#include <iostream.h>
#include <string.h>
int &l_word,int &l_word1,char *word,char *word1,
ofstream &to1)
{
{
z = (p - p1 );
strcpy(p2,word1); //вставим тег <br> !!!
p +=l_word;
{
{
return (1);
{
to1.close(); // always pays to be tidy
return (1);
char word1 []= "<br>";
char wordA []= "<A HREF=";
char wordB []= "<BODY";
char wordC []= "<FRAME SRC=";
char wordD []= "<SCRIPT LANGUAGE=";
char wordE []= "<MAP NAME=";
char wordF []= "<AREA SHAPE";
char wordG []= "</MAP";
char wordH []= "<FRAMESET";
char wordI []= "<H1";
char wordJ []= "<H2";
char wordK []= "<DIV";
char wordL []= "</DIV";
char wordM []= "";
char buf1[len] ;
//--------------------------------------------------
int l_word = strlen(word);
int l_word1 = strlen(word1);
char *p1 = buf;//сорентируем указатель на начало массива buf
char *p1a = buf;//сорентируем указатель на начало массива buf
char *p3 = buf1;//сорентируем указатель на начало массива buf1
while (!from1.eof())
{
p = buf; //сорентируем указатель на начало массива buf
p1 = buf; //сорентируем указатель на начало массива buf
p1a = buf; //сорентируем указатель на начало массива buf
p3 = buf1;//сорентируем указатель на начало массива buf
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordA, word1,to1) ;
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordB, word1,to1) ;
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordC, word1,to1) ;
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordD, word1,to1) ;
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordE, word1,to1) ;
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordF, word1,to1) ;
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordG, word1,to1) ;
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordH, word1,to1) ;
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordI, word1,to1) ;
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordJ, word1,to1) ;
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordK, word1,to1) ;
fun1 (p1a,p3, p,p1,p2,l_word,l_word1, wordL, word1,to1) ;
Результат:
программы Microsoft Visual C++
Результат находится в файле fileTo.txt
в рабочей директории программы.
Ключ к работе программы находится в описании работы
ее функции fun1.
const int len = 200;
char buf[len];
char buf1[len] ;
char *p = buf;//сорентируем указатель на начало массива buf
И ориентируем первые три указателя на начало первого массива,
char *p1 = buf;//сорентируем указатель на начало массива buf
char *p1a = buf;//сорентируем указатель на начало массива buf
char *p3 = buf1;//сорентируем указатель на начало массива buf1
другие два указателя на начало второго массива.
при помощи функции getline() и снова ориентируем указатели
на начало массивов, затем вызываем функцию fun1()
{
p = buf; //сорентируем указатель на начало массива buf
p1 = buf; //сорентируем указатель на начало массива buf
p1a = buf; //сорентируем указатель на начало массива buf
p3 = buf1;//сорентируем указатель на начало массива buf
p3a = buf1;//сорентируем указатель на начало массива buf
что объявленных и инициализированных указателей - p1a, p3, p, p1, p2,
массив buf1 (в данном случае передается адрес массива).
char*
fun1
(char *p1a, char *p3, char *p,
int &l_word1, char *word, char *word1,
char *buf1,ofstream &to1)
{
z = (p - p1 );
strcpy(p2,word1); //вставим тег <br> !!!
p +=l_word;
Все параметры являются либо указателями либо ссылками.
которая ищет первое вхождение (первое появление) лексемы содержащейся в
массиве word в массив, на который указывает указатель p.
то есть адрес элемента массива c которого начинается вхождение лексемы.
скопировать из массива buf в массив buf1
z = (p - p1 );
а p - на первое вхождение лексемы в массив buf.
и копируем их в массив buf1, на который указывает указатель p2
которого указывает указатель p1 в массив buf1 на который указывает указатель p2
символов, чтобы можно было вставить новую лексему, содержащуюся
в массиве word1 (в случае нашей прогаммы в word1 содержится тег)
strcpy(p2,word1); //вставим тег <br> !!!
содержалось в word1
word1.
3. Теперь подтянем указатель p1 массива buf на позицию, где находится
указатель p, а указатель p передвинем вперед на число символов
из которых состоит лексема word.
p +=l_word;
лексемы word в строку, содержащуюся в массиве buf.
в строку. После этого функция заголовка возвратит нуль и цикл
закончится Далее cкопируем в buf1 остаток строки из buf
(обработать) эту строку еще раз, но в поиске и замене уже другой лексемы
при новом вызове функции fun1 с новыми аргументами.
содержимое buf стирается.
Содержание